package top.lishuoboy.ssm.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import top.lishuoboy.ssm.WebAppConfig;
import top.lishuoboy.ssm.config.properties.DataSourceProps;

import javax.sql.DataSource;

@EnableTransactionManagement
@MapperScan("top.lishuoboy.ssm.mapper")
@Import(DataSourceProps.class)
// 不用扫描 @Controller 注解
@ComponentScan(basePackageClasses = WebAppConfig.class, excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ANNOTATION, classes = {org.springframework.stereotype.Controller.class})})
@Configuration  // 直接调用@Bean方法注入时需要 @Configuration，否则报错：“直接调用使用 @Bean 注解的方法。请改用依赖项注入。” 见下面的 return new JdbcTemplate(dataSource());
public class SpringConfig {
    @Autowired
    private DataSourceProps dsProps;

    @Bean
    DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
//        ds.setDriverClassName(dsProps.getDriver());
        ds.setUrl(dsProps.getUrl());
        ds.setUsername(dsProps.getUser());
        ds.setPassword(dsProps.getPass());
        return ds;
    }

    @Bean
    JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());  // 直接调用@Bean方法注入时需要 @Configuration，否则报错：“直接调用使用 @Bean 注解的方法。请改用依赖项注入。”
    }

    @Bean
    SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());      // 直接调用@Bean方法注入时需要 @Configuration，否则报错：“直接调用使用 @Bean 注解的方法。请改用依赖项注入。”
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    /* 注意：为事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactoryBean 的是同一个数据源，否则事务管理器就无法工作了。 */
    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}